<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<head>
    <title>Reference</title>
    <link rel="stylesheet" href="../ldoc.css" type="text/css" />
</head>
<body>

<div id="container">

<div id="product">
	<div id="product_logo"></div>
	<div id="product_name"><big><b></b></big></div>
	<div id="product_description"></div>
</div> <!-- id="product" -->


<div id="main">


<!-- Menu -->

<div id="navigation">
<br/>
<h1>Duplex</h1>

<ul>
  <li><a href="../index.html">Index</a></li>
</ul>

<h2>Contents</h2>
<ul>
<li><a href="#Functions">Functions</a></li>
<li><a href="#Fields">Fields</a></li>
</ul>


<h2>Modules</h2>
<ul class="$(kind=='Topics' and '' or 'nowrap'">
  <li><a href="../modules/Duplex.Application.html">Duplex.Application</a></li>
  <li><a href="../modules/Duplex.Applications.Effect.html">Duplex.Applications.Effect</a></li>
  <li><a href="../modules/Duplex.Applications.GridPie.html">Duplex.Applications.GridPie</a></li>
  <li><a href="../modules/Duplex.Applications.Hydra.html">Duplex.Applications.Hydra</a></li>
  <li><a href="../modules/Duplex.Applications.Instrument.html">Duplex.Applications.Instrument</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.GridLayout.html">Duplex.Applications.Keyboard.GridLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.HarmonicLayout.html">Duplex.Applications.Keyboard.Layouts.HarmonicLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.IsomorphicLayout.html">Duplex.Applications.Keyboard.Layouts.IsomorphicLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.Layouts.PianoLayout.html">Duplex.Applications.Keyboard.Layouts.PianoLayout</a></li>
  <li><a href="../modules/Duplex.Applications.Keyboard.html">Duplex.Applications.Keyboard</a></li>
  <li><a href="../modules/Duplex.Applications.Matrix.html">Duplex.Applications.Matrix</a></li>
  <li><a href="../modules/Duplex.Applications.Metronome.html">Duplex.Applications.Metronome</a></li>
  <li><a href="../modules/Duplex.Applications.MidiActions.Bindings.html">Duplex.Applications.MidiActions.Bindings</a></li>
  <li><a href="../modules/Duplex.Applications.MidiActions.html">Duplex.Applications.MidiActions</a></li>
  <li><a href="../modules/Duplex.Applications.Mixer.html">Duplex.Applications.Mixer</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_group.html">Duplex.Applications.Mlrx.Mlrx_group</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_note.html">Duplex.Applications.Mlrx.Mlrx_note</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_pos.html">Duplex.Applications.Mlrx.Mlrx_pos</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.Mlrx_track.html">Duplex.Applications.Mlrx.Mlrx_track</a></li>
  <li><a href="../modules/Duplex.Applications.Mlrx.html">Duplex.Applications.Mlrx</a></li>
  <li><a href="../modules/Duplex.Applications.Navigator.html">Duplex.Applications.Navigator</a></li>
  <li><a href="../modules/Duplex.Applications.NotesOnWheels.html">Duplex.Applications.NotesOnWheels</a></li>
  <li><a href="../modules/Duplex.Applications.PatternCursor.html">Duplex.Applications.PatternCursor</a></li>
  <li><a href="../modules/Duplex.Applications.PatternSequence.html">Duplex.Applications.PatternSequence</a></li>
  <li><a href="../modules/Duplex.Applications.Recorder.html">Duplex.Applications.Recorder</a></li>
  <li><a href="../modules/Duplex.Applications.Repeater.html">Duplex.Applications.Repeater</a></li>
  <li><a href="../modules/Duplex.Applications.Rotate.html">Duplex.Applications.Rotate</a></li>
  <li><a href="../modules/Duplex.Applications.StepSequencer.html">Duplex.Applications.StepSequencer</a></li>
  <li><a href="../modules/Duplex.Applications.SwitchConfiguration.html">Duplex.Applications.SwitchConfiguration</a></li>
  <li><a href="../modules/Duplex.Applications.TestPad.html">Duplex.Applications.TestPad</a></li>
  <li><a href="../modules/Duplex.Applications.TrackSelector.html">Duplex.Applications.TrackSelector</a></li>
  <li><a href="../modules/Duplex.Applications.Transport.html">Duplex.Applications.Transport</a></li>
  <li><a href="../modules/Duplex.Applications.UIButtonTest.html">Duplex.Applications.UIButtonTest</a></li>
  <li><a href="../modules/Duplex.Applications.XYPad.html">Duplex.Applications.XYPad</a></li>
  <li><a href="../modules/Duplex.Automation.html">Duplex.Automation</a></li>
  <li><a href="../modules/Duplex.Browser.html">Duplex.Browser</a></li>
  <li><a href="../modules/Duplex.BrowserProcess.html">Duplex.BrowserProcess</a></li>
  <li><a href="../modules/Duplex.Canvas.html">Duplex.Canvas</a></li>
  <li><a href="../modules/Duplex.CanvasPoint.html">Duplex.CanvasPoint</a></li>
  <li><a href="../modules/Duplex.ControlMap.html">Duplex.ControlMap</a></li>
  <li><a href="../modules/Duplex.Device.html">Duplex.Device</a></li>
  <li><a href="../modules/Duplex.Display.html">Duplex.Display</a></li>
  <li><a href="../modules/Duplex.Globals.html">Duplex.Globals</a></li>
  <li><a href="../modules/Duplex.Message.html">Duplex.Message</a></li>
  <li><a href="../modules/Duplex.MessageStream.html">Duplex.MessageStream</a></li>
  <li><a href="../modules/Duplex.MidiDevice.html">Duplex.MidiDevice</a></li>
  <li><a href="../modules/Duplex.OscClient.html">Duplex.OscClient</a></li>
  <li><a href="../modules/Duplex.OscDevice.html">Duplex.OscDevice</a></li>
  <li><strong>Duplex.OscVoiceMgr</strong></li>
  <li><a href="../modules/Duplex.Preferences.html">Duplex.Preferences</a></li>
  <li><a href="../modules/Duplex.ProcessSlicer.html">Duplex.ProcessSlicer</a></li>
  <li><a href="../modules/Duplex.RoamingDSP.html">Duplex.RoamingDSP</a></li>
  <li><a href="../modules/Duplex.Scheduler.html">Duplex.Scheduler</a></li>
  <li><a href="../modules/Duplex.StateController.html">Duplex.StateController</a></li>
  <li><a href="../modules/Duplex.UIButton.html">Duplex.UIButton</a></li>
  <li><a href="../modules/Duplex.UIButtonStrip.html">Duplex.UIButtonStrip</a></li>
  <li><a href="../modules/Duplex.UIComponent.html">Duplex.UIComponent</a></li>
  <li><a href="../modules/Duplex.UIKey.html">Duplex.UIKey</a></li>
  <li><a href="../modules/Duplex.UIKeyPressure.html">Duplex.UIKeyPressure</a></li>
  <li><a href="../modules/Duplex.UILabel.html">Duplex.UILabel</a></li>
  <li><a href="../modules/Duplex.UIPad.html">Duplex.UIPad</a></li>
  <li><a href="../modules/Duplex.UIPitchBend.html">Duplex.UIPitchBend</a></li>
  <li><a href="../modules/Duplex.UISlider.html">Duplex.UISlider</a></li>
  <li><a href="../modules/Duplex.UISpinner.html">Duplex.UISpinner</a></li>
  <li><a href="../modules/Duplex.WidgetHooks.html">Duplex.WidgetHooks</a></li>
  <li><a href="../modules/Duplex.WidgetKeyboard.html">Duplex.WidgetKeyboard</a></li>
  <li><a href="../modules/Duplex.html">Duplex</a></li>
  <li><a href="../modules/main.html">main</a></li>
</ul>

</div>

<div id="content">

<h1>Module <code>Duplex.OscVoiceMgr</code></h1>
<p>The OscVoiceMgr is a class for handling internally triggered notes, keeping track of the active voices and their context</p>

<p>The purpose is to keep track of active voices, and their context: how the note got triggered: which device/application/instrument/pitch etc.</p>
<p>


<p>Some of the problems that a voice-manager can solve:</p>

<ul>
    <li>Notes are getting stuck when a keyboard octave is "virtually transposed", as the released key will transmit a different pitch than the pressed one. Solution: simply tell the voice-manager that your application's base octave has been changed with this &amp; that many semitones. </li>
    <li>When the same note is triggered multiple times, once any key is released, the remaining voices are also stopped. Solution: Trigger notes with the <a href="../modules/Duplex.OscVoiceMgr.html#self.keep_until_all_released">keep_until_all_released</a>  flag, and the note is kept alive until all pressed notes are released</li>
</ul>

<h3>Changes</h3>

<p>  0.99.4</p>
<pre><code>- Support for trigger options (hold/mono modes)
- Register_callback(), makes apps able to receive notifications
</code></pre>

<p>  0.98.15</p>
<pre><code>- First release
</code></pre>



</p>


<h2><a href="#Functions">Functions</a></h2>
<table class="function_list">
	<tr>
	<td class="name" nowrap><a href="#__init">__init ()</a></td>
	<td class="summary">Initialize the OscVoiceMgr class</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#trigger">trigger (app, instr_idx, track_idx, pitch, velocity, keep, is_midi, channel)</a></td>
	<td class="summary">This is the main trigger function</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#release">release (app, instr_idx, track_idx, pitch, velocity, is_midi, channel, force)</a></td>
	<td class="summary">The main release function.</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_was_osc_triggered">_was_osc_triggered (str_app, pitch, channel)</a></td>
	<td class="summary">If OSC triggered this note, return true</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_was_midi_triggered">_was_midi_triggered (str_app, pitch, channel)</a></td>
	<td class="summary">If MIDI triggered this note, return true</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_trigger_note">_trigger_note (app, instr_idx, track_idx, pitch, velocity, is_midi, channel)</a></td>
	<td class="summary">Trigger a note
 note: also used for turning off notes using "hold mode"</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_release_note">_release_note (app, instr_idx, track_idx, pitch, velocity, is_midi, channel)</a></td>
	<td class="summary">Release a given note.</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_get_pitch_offset">_get_pitch_offset ()</a></td>
	<td class="summary">Return the pitch offset, a value which is used to "counter-transpose"
 the transposition amount which Renoise automatically assign to MIDI-notes
 (the value of which based on the current octave).</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_get_app_name">_get_app_name (app)</a></td>
	<td class="summary">Return a unique name for any running process/application
 (can be called as static method)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#note_is_active">note_is_active (instr_idx, pitch)</a></td>
	<td class="summary">Check if a particular instrument-note is still playing, somewhere...</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#_notify_applications">_notify_applications (evt, note, idx)</a></td>
	<td class="summary">When voices are added or removed, notify the application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#transpose">transpose (app, semitones)</a></td>
	<td class="summary">When an application transpose it's control surface, any triggered note
 would need to be "de-transposed" once it's released - this function will
 apply the amount of transpose to the currently held notes (the ones that
 match the application as their originating_app)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#remove_all_voices">remove_all_voices ()</a></td>
	<td class="summary">remove all active voices</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#remove_voices">remove_voices (app, instr_idx)</a></td>
	<td class="summary">remove active voices from a given application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#purge_voices">purge_voices (app, instr_idx)</a></td>
	<td class="summary">purge voices from provided application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#register_callback">register_callback (app, func)</a></td>
	<td class="summary">Remove application from active voices (release, then remove)</td>
	</tr>
</table>
<h2><a href="#Fields">Fields</a></h2>
<table class="function_list">
	<tr>
	<td class="name" nowrap><a href="#self.app">self.app</a></td>
	<td class="summary">(<a href="../modules/Duplex.Application.html#">Duplex.Application</a>) the application that triggered this note</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.originating_app">self.originating_app</a></td>
	<td class="summary">(string) a string for identifying the application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.keep_until_all_released">self.keep_until_all_released</a></td>
	<td class="summary">(bool) decide whether a released key should wait for all other
 pressed keys before it is allowed to release
 (set this to false if you're triggering notes with a pad controller
 that doesn't send release notes)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.temp_transpose">self.temp_transpose</a></td>
	<td class="summary">(int) the temporary transpose of the application</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.is_held">self.is_held</a></td>
	<td class="summary">(bool) whether or not the key is held</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.pitch">self.pitch</a></td>
	<td class="summary">(int) pitch</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.velocity">self.velocity</a></td>
	<td class="summary">(int) velocity</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.is_midi">self.is_midi</a></td>
	<td class="summary">(bool) true when MIDI, false means OSC</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.channel">self.channel</a></td>
	<td class="summary">(int) for midi, but also helps to differentiate <br/>
 (when looking for osc-triggered notes)</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.instr_idx">self.instr_idx</a></td>
	<td class="summary">(int) the Renoise instrument index</td>
	</tr>
	<tr>
	<td class="name" nowrap><a href="#self.track_idx">self.track_idx</a></td>
	<td class="summary">(int) the Renoise track index</td>
	</tr>
</table>

<br/>
<br/>


    <h2><a name="Functions"></a>Functions</h2>
    <dl class="function">
    <dt>
    <a name = "__init"></a>
    <strong>__init ()</strong>
    </dt>
    <dd>
    Initialize the OscVoiceMgr class







</dd>
    <dt>
    <a name = "trigger"></a>
    <strong>trigger (app, instr_idx, track_idx, pitch, velocity, keep, is_midi, channel)</strong>
    </dt>
    <dd>
    This is the main trigger function


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>) the calling application
        </li>
        <li><span class="parameter">instr_idx</span>
         (int) the Renoise instrument index
        </li>
        <li><span class="parameter">track_idx</span>
         (int) the Renoise track index
        </li>
        <li><span class="parameter">pitch</span>
         (int) 0-120
        </li>
        <li><span class="parameter">velocity</span>
         (int) 0-127
        </li>
        <li><span class="parameter">keep</span>
         (bool) if true, keep all notes until release
        </li>
        <li><span class="parameter">is_midi</span>
         (bool) to distinguish between OSC and MIDI notes
        </li>
        <li><span class="parameter">channel</span>
         (int) the MIDI channel, 1-16 (not used!!)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "release"></a>
    <strong>release (app, instr_idx, track_idx, pitch, velocity, is_midi, channel, force)</strong>
    </dt>
    <dd>
    The main release function.  Will ensure that the right notes are released,
 even when the keyboard has been transposed since the notes were triggered


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>) the calling application
        </li>
        <li><span class="parameter">instr_idx</span>
         (int) the Renoise instrument index
        </li>
        <li><span class="parameter">track_idx</span>
         (int) the Renoise track index
        </li>
        <li><span class="parameter">pitch</span>
         (int) 0-120
        </li>
        <li><span class="parameter">velocity</span>
         (int) 0-127
        </li>
        <li><span class="parameter">is_midi</span>
         (bool) to distinguish between OSC and MIDI notes
        </li>
        <li><span class="parameter">channel</span>
         (int) the MIDI channel, 1-16
        </li>
        <li><span class="parameter">force</span>
         (bool) skip the check for hold mode
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        int, the amount of temp-transpose detected (in semitones)
    </ol>


    <h3>See also:</h3>
    <ul>
         <a href="../modules/Duplex.OscVoiceMgr.html#_release_note">OscVoiceMgr:_release_note</a>
    </ul>


</dd>
    <dt>
    <a name = "_was_osc_triggered"></a>
    <strong>_was_osc_triggered (str_app, pitch, channel)</strong>
    </dt>
    <dd>
    If OSC triggered this note, return true


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">str_app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>), the originating application
        </li>
        <li><span class="parameter">pitch</span>
         (int) 0-120
        </li>
        <li><span class="parameter">channel</span>
         (int) the MIDI channel, 1-16
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool
    </ol>




</dd>
    <dt>
    <a name = "_was_midi_triggered"></a>
    <strong>_was_midi_triggered (str_app, pitch, channel)</strong>
    </dt>
    <dd>
    If MIDI triggered this note, return true


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">str_app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>), the originating application
        </li>
        <li><span class="parameter">pitch</span>
         (int) 0-120
        </li>
        <li><span class="parameter">channel</span>
         (int) the MIDI channel, 1-16
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool
    </ol>




</dd>
    <dt>
    <a name = "_trigger_note"></a>
    <strong>_trigger_note (app, instr_idx, track_idx, pitch, velocity, is_midi, channel)</strong>
    </dt>
    <dd>
    Trigger a note
 note: also used for turning off notes using "hold mode"


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>



        </li>
        <li><span class="parameter">instr_idx</span>



        </li>
        <li><span class="parameter">track_idx</span>



        </li>
        <li><span class="parameter">pitch</span>



        </li>
        <li><span class="parameter">velocity</span>



        </li>
        <li><span class="parameter">is_midi</span>



        </li>
        <li><span class="parameter">channel</span>



        </li>
    </ul>





</dd>
    <dt>
    <a name = "_release_note"></a>
    <strong>_release_note (app, instr_idx, track_idx, pitch, velocity, is_midi, channel)</strong>
    </dt>
    <dd>
    Release a given note.  We do not release notes directly,
 this method is called by the main release() method when it has been
 determined that a note should be released


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>), the originating application
        </li>
        <li><span class="parameter">instr_idx</span>
         (int) the Renoise instrument index
        </li>
        <li><span class="parameter">track_idx</span>
         (int) the Renoise track index
        </li>
        <li><span class="parameter">pitch</span>
         (int) 0-120
        </li>
        <li><span class="parameter">velocity</span>
         (int) 0-127
        </li>
        <li><span class="parameter">is_midi</span>
         (bool) to distinguish between OSC and MIDI notes
        </li>
        <li><span class="parameter">channel</span>
         (int) the MIDI channel, 1-16
        </li>
    </ul>



    <h3>See also:</h3>
    <ul>
         <a href="../modules/Duplex.OscVoiceMgr.html#release">OscVoiceMgr:release</a>
    </ul>


</dd>
    <dt>
    <a name = "_get_pitch_offset"></a>
    <strong>_get_pitch_offset ()</strong>
    </dt>
    <dd>
    Return the pitch offset, a value which is used to "counter-transpose"
 the transposition amount which Renoise automatically assign to MIDI-notes
 (the value of which based on the current octave).



    <h3>Returns:</h3>
    <ol>

        int, number of semitones
    </ol>




</dd>
    <dt>
    <a name = "_get_app_name"></a>
    <strong>_get_app_name (app)</strong>
    </dt>
    <dd>
    Return a unique name for any running process/application
 (can be called as static method)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>)
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        string, e.g. "Launchpad_MyMixer"
    </ol>




</dd>
    <dt>
    <a name = "note_is_active"></a>
    <strong>note_is_active (instr_idx, pitch)</strong>
    </dt>
    <dd>
    Check if a particular instrument-note is still playing, somewhere...


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">instr_idx</span>
         (int) instrument index
        </li>
        <li><span class="parameter">pitch</span>
         (int) note pitch
        </li>
    </ul>

    <h3>Returns:</h3>
    <ol>

        bool
    </ol>




</dd>
    <dt>
    <a name = "_notify_applications"></a>
    <strong>_notify_applications (evt, note, idx)</strong>
    </dt>
    <dd>
    When voices are added or removed, notify the application


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">evt</span>



        </li>
        <li><span class="parameter">note</span>



        </li>
        <li><span class="parameter">idx</span>



        </li>
    </ul>





</dd>
    <dt>
    <a name = "transpose"></a>
    <strong>transpose (app, semitones)</strong>
    </dt>
    <dd>
    When an application transpose it's control surface, any triggered note
 would need to be "de-transposed" once it's released - this function will
 apply the amount of transpose to the currently held notes (the ones that
 match the application as their originating_app)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>)
        </li>
        <li><span class="parameter">semitones</span>
         (int)
        </li>
    </ul>





</dd>
    <dt>
    <a name = "remove_all_voices"></a>
    <strong>remove_all_voices ()</strong>
    </dt>
    <dd>
    remove all active voices







</dd>
    <dt>
    <a name = "remove_voices"></a>
    <strong>remove_voices (app, instr_idx)</strong>
    </dt>
    <dd>
    remove active voices from a given application


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>)
        </li>
        <li><span class="parameter">instr_idx</span>
         (int) this instrument only, optional
        </li>
    </ul>





</dd>
    <dt>
    <a name = "purge_voices"></a>
    <strong>purge_voices (app, instr_idx)</strong>
    </dt>
    <dd>
    purge voices from provided application


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>)
        </li>
        <li><span class="parameter">instr_idx</span>
         (int, optional) only remove voices from this instrument
        </li>
    </ul>





</dd>
    <dt>
    <a name = "register_callback"></a>
    <strong>register_callback (app, func)</strong>
    </dt>
    <dd>
    Remove application from active voices (release, then remove)


    <h3>Parameters:</h3>
    <ul>
        <li><span class="parameter">app</span>
         (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>)
        </li>
        <li><span class="parameter">func</span>
         (Function)
        </li>
    </ul>





</dd>
</dl>
    <h2><a name="Fields"></a>Fields</h2>
    <dl class="function">
    <dt>
    <a name = "self.app"></a>
    <strong>self.app</strong>
    </dt>
    <dd>
    (<a href="../modules/Duplex.Application.html#">Duplex.Application</a>) the application that triggered this note







</dd>
    <dt>
    <a name = "self.originating_app"></a>
    <strong>self.originating_app</strong>
    </dt>
    <dd>
    (string) a string for identifying the application







</dd>
    <dt>
    <a name = "self.keep_until_all_released"></a>
    <strong>self.keep_until_all_released</strong>
    </dt>
    <dd>
    (bool) decide whether a released key should wait for all other
 pressed keys before it is allowed to release
 (set this to false if you're triggering notes with a pad controller
 that doesn't send release notes)







</dd>
    <dt>
    <a name = "self.temp_transpose"></a>
    <strong>self.temp_transpose</strong>
    </dt>
    <dd>
    (int) the temporary transpose of the application







</dd>
    <dt>
    <a name = "self.is_held"></a>
    <strong>self.is_held</strong>
    </dt>
    <dd>
    (bool) whether or not the key is held







</dd>
    <dt>
    <a name = "self.pitch"></a>
    <strong>self.pitch</strong>
    </dt>
    <dd>
    (int) pitch







</dd>
    <dt>
    <a name = "self.velocity"></a>
    <strong>self.velocity</strong>
    </dt>
    <dd>
    (int) velocity







</dd>
    <dt>
    <a name = "self.is_midi"></a>
    <strong>self.is_midi</strong>
    </dt>
    <dd>
    (bool) true when MIDI, false means OSC







</dd>
    <dt>
    <a name = "self.channel"></a>
    <strong>self.channel</strong>
    </dt>
    <dd>
    (int) for midi, but also helps to differentiate <br/>
 (when looking for osc-triggered notes)







</dd>
    <dt>
    <a name = "self.instr_idx"></a>
    <strong>self.instr_idx</strong>
    </dt>
    <dd>
    (int) the Renoise instrument index







</dd>
    <dt>
    <a name = "self.track_idx"></a>
    <strong>self.track_idx</strong>
    </dt>
    <dd>
    (int) the Renoise track index







</dd>
</dl>


</div> <!-- id="content" -->
</div> <!-- id="main" -->
<div id="about">
<i>generated by <a href="http://github.com/stevedonovan/LDoc">LDoc 1.4.2</a></i>
</div> <!-- id="about" -->
</div> <!-- id="container" -->
</body>
</html>
